<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow: cfg/static_cfg_manager.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_cfb2ffb2869bbb27b7281952022eb856.html">cfg</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle"><div class="title">static_cfg_manager.hpp</div></div>
</div><!--header-->
<div class="contents">
<a href="static__cfg__manager_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/* Flow</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment"> * Copyright 2023 Akamai Technologies, Inc.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment"> *</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"> * Licensed under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment"> * &quot;License&quot;); you may not use this file except in</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment"> * compliance with the License.  You may obtain a copy</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment"> * of the License at</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"> *</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment"> *   https://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment"> *</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment"> * Unless required by applicable law or agreed to in</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment"> * writing, software distributed under the License is</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"> * distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment"> * CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment"> * See the License for the specific language governing</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment"> * permissions and limitations under the License. */</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="comment"></span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="comment">/// @file</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="comment"></span><span class="preprocessor">#pragma once</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span> </div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="preprocessor">#include &quot;<a class="code" href="cfg__manager__fwd_8hpp.html">flow/cfg/cfg_manager_fwd.hpp</a>&quot;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="preprocessor">#include &quot;<a class="code" href="cfg__manager_8hpp.html">flow/cfg/cfg_manager.hpp</a>&quot;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span> </div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceflow_1_1cfg.html">flow::cfg</a></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span>{</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span> </div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span><span class="comment">// Types.</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span><span class="comment"></span> </div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span><span class="comment">/**</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span><span class="comment"> * A `Config_manager`-related adapter-style class that manages a simple config setup involving a single</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span><span class="comment"> * (though arbitrarily complex) `Option_set&lt;&gt;`-ready raw value `struct` config store type `Value_set`, meant to</span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span><span class="comment"> * be used only in static fashion.  That is to say, the parsed config values are not meant to be accessed</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span><span class="comment"> * *while* the config is being read from file.</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span><span class="comment"> *</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span><span class="comment"> * If you desire dynamic config (which can be read from file(s) at any time), and/or you need to manage more than</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span><span class="comment"> * one config `struct` (e.g., you&#39;re controlling 2+ entirely separate modules), then please use</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span><span class="comment"> * Config_manager which supports all that.  (You can also develop your own handling of `Option_set&lt;Value_set&gt;`</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span><span class="comment"> * instead.  See Config_manager doc header.)</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span><span class="comment"> *</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span><span class="comment"> * The life cycle and usage are simple.  Define your `Value_set` (see Option_set doc header for formal requirements,</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span><span class="comment"> * but basically you&#39;ll need a `struct`, an option-defining function using FLOW_CFG_OPTION_SET_DECLARE_OPTION(),</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span><span class="comment"> * and possibly an inter-option validator function).  Construct the `Static_config_manager&lt;Value_set&gt;`.</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span><span class="comment"> * Call apply() to read a file.  (You can do this more than once, potentially for different files.  As of this writing</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span><span class="comment"> * only files are supported, but adding command line parsing would be an incremental change.)  Then,</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span><span class="comment"> * call values() to get the reference to the immutable parsed `Value_set`.  This reference can be passed around the</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span><span class="comment"> * application; values() will always return the same reference.  Technically you could call apply() even after</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span><span class="comment"> * using values(); but it is not thread-safe to do so while accessing config values which would change concurrently</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span><span class="comment"> * with no protection.</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span><span class="comment"> *</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span><span class="comment"> * Also you may create a `const` (immutable) Static_config_manager via its constructor and then just use it to output</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span><span class="comment"> * a help message (log_help() or help_to_ostream()).  This could be used with your program&#39;s `--help` option or similar,</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span><span class="comment"> * and that&#39;s it (no parsing takes place).</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span><span class="comment"> *</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span><span class="comment"> *   ~~~</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span><span class="comment"> *   // Example of a Static_config_manager created just to log the help, and that&#39;s it.</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span><span class="comment"> *   flow::cfg::Static_config_manager&lt;Static_value_set&gt;</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span><span class="comment"> *     (get_logger(), &quot;cfg&quot;, &amp;static_cfg_declare_opts)</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span><span class="comment"> *     .log_help();</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span><span class="comment"> *   ~~~</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span><span class="comment"> *</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span><span class="comment"> * @note Config_manager provides the optional `commit == false` mode in apply_static(); this enables the</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span><span class="comment"> *       &quot;multi-source parsing and source skipping&quot; described in its doc header.  Static_config_manager, to keep</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span><span class="comment"> *       its mission simple, cuts off access to this feature, meaning implicitly it always takes</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span><span class="comment"> *       `commit` to equal `true`.  That is, it is expected you&#39;ll be loading static config from exactly</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span><span class="comment"> *       one file/one apply() call per attempt.  Your Final_validator_func::Type `final_validator_func()`</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span><span class="comment"> *       *should* return either Final_validator_outcome::S_ACCEPT or Final_validator_outcome::S_FAIL.  It *can* return</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span><span class="comment"> *       Final_validator_outcome::S_SKIP, but that would mean apply() will return `true` (success)</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span><span class="comment"> *       but simply no-op (not update the canonical config as returned by values()).</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span><span class="comment"> *</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span><span class="comment"> * ### Rationale ###</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span><span class="comment"> * Config_manager is in the author&#39;s opinion not difficult to use, but it *does* use template parameter packs</span></div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span><span class="comment"> * (`typename... Value_set`), and its API can be somewhat difficult to grok when all you have is the aforementioned</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span><span class="comment"> * simple use case.</span></div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span><span class="comment"> *</span></div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span><span class="comment"> * @tparam Value_set</span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span><span class="comment"> *         The settings `struct` -- see Option_set doc header for requirements.</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span><span class="comment"> */</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Value_set&gt;</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"><a class="line" href="classflow_1_1cfg_1_1Static__config__manager.html">   79</a></span><span class="keyword">class </span><a class="code hl_class" href="classflow_1_1cfg_1_1Static__config__manager.html">Static_config_manager</a> :</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span>  <span class="keyword">private</span> <a class="code hl_class" href="classflow_1_1cfg_1_1Config__manager.html">Config_manager</a>&lt;Value_set, Null_value_set&gt;</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span>{</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span><span class="comment"></span> </div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span><span class="comment">   * Tag type: indicates an apply() method must *allow* invalid defaults and only complain if the config source</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span><span class="comment">   * does not explicitly supply a valid value.  Otherwise the defaults themselves are also stringently checked</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span><span class="comment">   * regardless of whether they are overridden.  This setting applies only to individual-option-validators.</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span><span class="comment">   * Final_validator_func validation is orthogonal to this.</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span><span class="comment">   */</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"><a class="line" href="classflow_1_1cfg_1_1Static__config__manager.html#a3d2415bc18039b0faeddb7181a8eb61f">   91</a></span>  <span class="keyword">enum</span> <a class="code hl_enumeration" href="classflow_1_1cfg_1_1Static__config__manager.html#a3d2415bc18039b0faeddb7181a8eb61f">allow_invalid_defaults_tag_t</a></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span>  {</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span>    <a class="code hl_enumvalue" href="classflow_1_1cfg_1_1Static__config__manager.html#a3d2415bc18039b0faeddb7181a8eb61fab3dc15779c4820ed5ee06299bedf718a">S_ALLOW_INVALID_DEFAULTS</a> <span class="comment">///&lt; Sole value for tag type #allow_invalid_defaults_tag_t.</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"><a class="line" href="classflow_1_1cfg_1_1Static__config__manager.html#a3d2415bc18039b0faeddb7181a8eb61fab3dc15779c4820ed5ee06299bedf718a">   94</a></span>  };</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span><span class="comment"></span> </div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span><span class="comment">   * The class we `private`ly subclass (in HAS-A fashion, not IS-A fashion).  It is `public` basically so that we can</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span><span class="comment">   * refer to it in various forwarding `using` method directives below.</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span><span class="comment">   */</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"><a class="line" href="classflow_1_1cfg_1_1Static__config__manager.html#a3c117c15e6e00244534099e97d104d35">  100</a></span>  <span class="keyword">using </span><a class="code hl_class" href="classflow_1_1cfg_1_1Config__manager.html">Impl</a> = <a class="code hl_class" href="classflow_1_1cfg_1_1Config__manager.html">Config_manager&lt;Value_set, Null_value_set&gt;</a>;</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span> </div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span><span class="comment"></span> </div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span><span class="comment">   * Constructs a Static_config_manager ready to read static config via apply() and access it via values().</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span><span class="comment">   *</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span><span class="comment">   * ### Logging assumption ###</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span><span class="comment">   * `*logger_ptr` is a standard logging arg.  Note, though, that the class will assume that log verbosity may not have</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span><span class="comment">   * yet been configured -- since this Static_config_manager may be the thing configuring it.  Informal recommendations:</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span><span class="comment">   *   - You should let through INFO and WARNING messages in `*logger_ptr`.</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span><span class="comment">   *   - If you plan to use `*this` only for log_help() (such as in your `--help` implementation), you should</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span><span class="comment">   *     *not* let through TRACE-or-more-verbose.</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span><span class="comment">   *   - Once (and if) you engage any actual parsing (apply()), TRACE may be helpful</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span><span class="comment">   *     in debugging as usual.</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span><span class="comment">   *</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span><span class="comment">   *        Logger to use for subsequently logging.</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span><span class="comment">   * @param nickname</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span><span class="comment">   *        Brief string used for logging subsequently.</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span><span class="comment">   * @param declare_opts_func_moved</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span><span class="comment">   *        The declare-options callback as required by</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span><span class="comment">   *        `Option_set&lt;Value_set&gt;` constructor; see its doc header for instructions.</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span><span class="comment">   */</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#a77853af82c708377723671c92c6ab948">Static_config_manager</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr, <a class="code hl_typedef" href="namespaceflow_1_1util.html#ae4dc52186797094b3040379ff19124c9">util::String_view</a> nickname,</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span>                                 <span class="keyword">typename</span> <a class="code hl_class" href="classflow_1_1Function.html">Option_set&lt;Value_set&gt;::Declare_options_func</a>&amp;&amp; declare_opts_func_moved);</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span> </div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span><span class="comment"></span> </div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span><span class="comment">   * Invoke this after construction to load the permanent set of static config from config sources including</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span><span class="comment">   * a static config file.  See also apply() overload with #allow_invalid_defaults_tag_t tag.</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span><span class="comment">   *</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span><span class="comment">   * After this runs and succeeds, you may use values() to access the loaded values (but see notes on</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span><span class="comment">   * `final_validator_func` arg and return value, regarding Final_validator_outcome::S_SKIP w/r/t</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span><span class="comment">   * `final_validator_func` arg).</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span><span class="comment">   *</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span><span class="comment">   * On failure returns `false`; else returns `true`.  In the former case the overall state is equal to that</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span><span class="comment">   * at entry to the method.  Tip: On failure you may want to exit program with error; or you</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span><span class="comment">   * can continue knowing that values() will return default values according to `Value_set()` no-arg ctor.</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span><span class="comment">   * WARNING(s) logged given failure.</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span><span class="comment">   *</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span><span class="comment">   * Before apply(), or after it fails, the contents of what values() returns will be the defaults from your `Value_set`</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span><span class="comment">   * structure in its constructed state.  This may or may not have utility depending on your application.</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span><span class="comment">   *</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span><span class="comment">   * apply() will *not* be tolerant of unknown option names appearing in the config source.</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span><span class="comment">   *</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span><span class="comment">   * @note `final_validator_func()` can be made quite brief by using convenience macro</span></div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span><span class="comment">   *       FLOW_CFG_OPT_CHECK_ASSERT().  This will take care of most logging in most cases.</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span><span class="comment">   *</span></div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span><span class="comment">   * @todo Add support for command line as a config source in addition to file(s), for static config in</span></div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span><span class="comment">   * cfg::Config_manager.</span></div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span><span class="comment">   *</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span><span class="comment">   * @param cfg_path</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">  154</span><span class="comment">   *        File to read.</span></div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span><span class="comment">   * @param final_validator_func</span></div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span><span class="comment">   *        If parsing and individual-option-validation succeed, the method shall return success if</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span><span class="comment">   *        `final_validator_func(V)` returns Final_validator_outcome::S_ACCEPT or Final_validator_outcome::S_SKIP,</span></div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span><span class="comment">   *        where V is the parsed `Value_set`; and in the former case values() post-this-method will return V.</span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span><span class="comment">   *        Informally: Please place individual-option validation</span></div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span><span class="comment">   *        into FLOW_CFG_OPTION_SET_DECLARE_OPTION() invocations; only use `final_validator_func()` for</span></div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span><span class="comment">   *        internal consistency checks (if any).</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span><span class="comment">   *        Informally: It is unlikely, with Static_config_manager, that it should return SKIP; that feature</span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span><span class="comment">   *        is only useful with the multi-file-update feature which is not accessible through</span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span><span class="comment">   *        Static_config_manager.  See the note about this in our class doc header.</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span><span class="comment">   * @return `true` if and only if successfully parsed config source and validated all settings including</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span><span class="comment">   *         `final_validator_func() != S_FAIL`; and defaults were also all individually</span></div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span><span class="comment">   *         valid.  If `true`, and `final_validator_func() == S_ACCEPT`, then values() shall return the</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span><span class="comment">   *         parsed `Value_set`.  If `true`, but `final_validator_func() == S_SKIP`, then values() shall return</span></div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span><span class="comment">   *         the default-cted `Value_set`</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span><span class="comment">   */</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#aacacd2c0eddaf68d0dc5e0c1407572f5">apply</a>(<span class="keyword">const</span> fs::path&amp; cfg_path,</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span>             <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code hl_class" href="classflow_1_1Function.html">Final_validator_func&lt;Value_set&gt;::Type</a>&amp; final_validator_func);</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span><span class="comment"></span> </div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span><span class="comment">   * Identical to similar apply() overload without #allow_invalid_defaults_tag_t tag; but skips the stringent</span></div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span><span class="comment">   * check on individual defaults&#39; validity.</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span><span class="comment">   *</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span><span class="comment">   * @see #allow_invalid_defaults_tag_t doc header and/or return-value doc just below.</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span><span class="comment">   *</span></div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span><span class="comment">   * @param cfg_path</span></div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span><span class="comment">   *        See other apply().</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span><span class="comment">   * @param final_validator_func</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span><span class="comment">   *        See other apply().</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span><span class="comment">   * @return See other apply().  However the latter will return `false` if a default is invalid, even if</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span><span class="comment">   *         file `cfg_path` explicitly sets it to a valid value.  This tagged overload will not.</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span><span class="comment">   */</span></div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#aacacd2c0eddaf68d0dc5e0c1407572f5">apply</a>(<a class="code hl_enumeration" href="classflow_1_1cfg_1_1Static__config__manager.html#a3d2415bc18039b0faeddb7181a8eb61f">allow_invalid_defaults_tag_t</a>,</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span>             <span class="keyword">const</span> fs::path&amp; cfg_path,</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span>             <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code hl_class" href="classflow_1_1Function.html">Final_validator_func&lt;Value_set&gt;::Type</a>&amp; final_validator_func);</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span><span class="comment"></span> </div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span><span class="comment">   * Equivalent to the other apply() but with no inter-option validation (meaning the per-option validation</span></div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span><span class="comment">   * passed to constructor is sufficient).  See also apply() overload with #allow_invalid_defaults_tag_t tag.</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span><span class="comment">   *</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span><span class="comment">   * @param cfg_path</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span><span class="comment">   *        File to read.</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span><span class="comment">   * @return `true` if and only if successfully parsed config source(s) and validated all settings;</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span><span class="comment">   *         and defaults were also all individually valid.</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span><span class="comment">   */</span></div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#aacacd2c0eddaf68d0dc5e0c1407572f5">apply</a>(<span class="keyword">const</span> fs::path&amp; cfg_path);</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span><span class="comment"></span> </div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span><span class="comment">   * Identical to similar apply() overload without #allow_invalid_defaults_tag_t tag; but skips the stringent</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span><span class="comment">   * check on individual defaults&#39; validity.</span></div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span><span class="comment">   *</span></div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span><span class="comment">   * @see #allow_invalid_defaults_tag_t doc header and/or return-value doc just below.</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span><span class="comment">   *</span></div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span><span class="comment">   * @param cfg_path</span></div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span><span class="comment">   *        See other apply().</span></div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span><span class="comment">   * @return See other apply().  However the latter will return `false` if a default is invalid, even if</span></div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span><span class="comment">   *         file `cfg_path` explicitly sets it to a valid value.  This tagged overload will not.</span></div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span><span class="comment">   */</span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#aacacd2c0eddaf68d0dc5e0c1407572f5">apply</a>(<a class="code hl_enumeration" href="classflow_1_1cfg_1_1Static__config__manager.html#a3d2415bc18039b0faeddb7181a8eb61f">allow_invalid_defaults_tag_t</a>,</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span>             <span class="keyword">const</span> fs::path&amp; cfg_path);</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span><span class="comment"></span> </div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span><span class="comment">   * Returns (always the same) reference to the managed `Value_set` structure.  Before successful apply() these</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span><span class="comment">   * values will be at their defaults.  Tip: It should be sufficient to pass around only the `const`</span></div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span><span class="comment">   * ref obtained here all around the app -- no `Value_set` copying should be needed.</span></div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span><span class="comment">   *</span></div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span><span class="comment">   * @return See above.  To reiterate: always the same reference is returned.</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span><span class="comment">   */</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span>  <span class="keyword">const</span> Value_set&amp; <a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#ae3576d329b71639e6acf38bb7a80e000">values</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span><span class="comment"></span> </div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span><span class="comment">   * Prints a human-targeted long-form summary of our contents, doubling as a usage message and a dump of current</span></div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span><span class="comment">   * values where applicable.  This is not thread-safe against several non-`const`- methods.</span></div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span><span class="comment">   *</span></div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span><span class="comment">   * @param os</span></div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span><span class="comment">   *        Stream to which to serialize.</span></div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span><span class="comment">   */</span></div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span>  <span class="keyword">using </span><a class="code hl_function" href="classflow_1_1cfg_1_1Config__manager.html#a19ae9775f51953805ea08086c276a78d">Impl::state_to_ostream</a>;</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span><span class="comment"></span> </div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span><span class="comment">   * Logs what state_to_ostream() would print.  This is not thread-safe against several non-`const`- methods.</span></div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span><span class="comment">   *</span></div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span><span class="comment">   * @param sev</span></div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span><span class="comment">   *        Severity to use for the log message(s).</span></div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span><span class="comment">   */</span></div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span>  <span class="keyword">using </span><a class="code hl_function" href="classflow_1_1cfg_1_1Config__manager.html#a220535219634c62ed2a580934c76c481">Impl::log_state</a>;</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span><span class="comment"></span> </div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span><span class="comment">   * Prints a human-targeted long-form usage message that includes all options with their descriptions and defaults.</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span><span class="comment">   * This is thread-safe against all concurrent methods on `*this` and can be invoked anytime after ctor.</span></div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span><span class="comment">   *</span></div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span><span class="comment">   * @param os</span></div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span><span class="comment">   *        Stream to which to serialize.</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span><span class="comment">   */</span></div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span>  <span class="keyword">using </span><a class="code hl_function" href="classflow_1_1cfg_1_1Config__manager.html#ad5cda6ace05e8bbe52a5129ed1c0720c">Impl::help_to_ostream</a>;</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span><span class="comment"></span> </div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span><span class="comment">   * Logs what help_to_ostream() would print.</span></div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span><span class="comment">   *</span></div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span><span class="comment">   * @param sev</span></div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span><span class="comment">   *        Severity to use for the log message(s).</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span><span class="comment">   */</span></div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">  257</span>  <span class="keyword">using </span><a class="code hl_function" href="classflow_1_1cfg_1_1Config__manager.html#a0192ddc2cc7302bdc8720ee56a395c02">Impl::log_help</a>;</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">  258</span> </div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">  259</span><span class="keyword">private</span>:<span class="comment"></span></div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">  260</span><span class="comment">  /// @cond</span></div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno">  261</span><span class="comment"></span>  <span class="comment">// -^- Doxygen, please ignore the following.  It gets confused by the following non-member `friend`.</span></div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">  262</span> </div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">  263</span>  <span class="comment">// Friend for access to `private` base.</span></div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">  264</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Value_set2&gt;</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">  265</span>  <span class="keyword">friend</span> std::ostream&amp; <a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#a9e86f85d749892c9e55ae74e07e48a35">operator&lt;&lt;</a>(std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1cfg_1_1Static__config__manager.html">Static_config_manager&lt;Value_set2&gt;</a>&amp; val);</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span> </div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span>  <span class="comment">// -v- Doxygen, please stop ignoring.</span><span class="comment"></span></div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span><span class="comment">  /// @endcond</span></div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span><span class="comment"></span>}; <span class="comment">// class Static_config_manager</span></div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span> </div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">  271</span><span class="comment">// Free functions.</span></div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">  272</span><span class="comment"></span> </div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">  273</span><span class="comment">/**</span></div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">  274</span><span class="comment"> * Serializes (briefly) a Static_config_manager to a standard output stream.</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">  275</span><span class="comment"> *</span></div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">  276</span><span class="comment"> * @relatesalso Static_config_manager</span></div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">  277</span><span class="comment"> *</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">  278</span><span class="comment"> * @tparam Value_set</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">  279</span><span class="comment"> *         See Static_config_manager doc header.</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span><span class="comment"> * @param os</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span><span class="comment"> *        Stream to which to serialize.</span></div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span><span class="comment"> * @param val</span></div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span><span class="comment"> *        Value to serialize.</span></div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span><span class="comment"> * @return `os`.</span></div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span><span class="comment"> */</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Value_set&gt;</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span>std::ostream&amp; <a class="code hl_function" href="namespaceflow_1_1cfg.html#af310e567f2763a9736eda686030e6311">operator&lt;&lt;</a>(std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1cfg_1_1Static__config__manager.html">Static_config_manager&lt;Value_set&gt;</a>&amp; val);</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span> </div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span><span class="comment">// Template implementations.</span></div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span> </div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Value_set&gt;</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"><a class="line" href="classflow_1_1cfg_1_1Static__config__manager.html#a77853af82c708377723671c92c6ab948">  292</a></span><a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#a77853af82c708377723671c92c6ab948">Static_config_manager&lt;Value_set&gt;::Static_config_manager</a></div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span>  (<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr, <a class="code hl_typedef" href="namespaceflow_1_1util.html#ae4dc52186797094b3040379ff19124c9">util::String_view</a> nickname,</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span>   <span class="keyword">typename</span> <a class="code hl_class" href="classflow_1_1Function.html">Option_set&lt;Value_set&gt;::Declare_options_func</a>&amp;&amp; declare_opts_func_moved) :</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span>  <a class="code hl_class" href="classflow_1_1cfg_1_1Config__manager.html">Impl</a>(logger_ptr, nickname, std::move(declare_opts_func_moved), <a class="code hl_function" href="namespaceflow_1_1cfg.html#adfe41c8484a878742976ddb84aa9e2d8">null_declare_opts_func</a>())</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span>{</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span>  <span class="comment">// Nope.</span></div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span>}</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span> </div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Value_set&gt;</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"><a class="line" href="classflow_1_1cfg_1_1Static__config__manager.html#aacacd2c0eddaf68d0dc5e0c1407572f5">  301</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#aacacd2c0eddaf68d0dc5e0c1407572f5">Static_config_manager&lt;Value_set&gt;::apply</a>(<span class="keyword">const</span> fs::path&amp; cfg_path,</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span>                                             <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code hl_class" href="classflow_1_1Function.html">Final_validator_func&lt;Value_set&gt;::Type</a>&amp; final_validator_func)</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span>{</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span>  <span class="keywordflow">return</span> this-&gt;<span class="keyword">template</span> apply_static&lt;Value_set&gt;(cfg_path, final_validator_func);</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span>  <span class="comment">/* Yes, that -&gt;template thing is highly weird-looking.  Without it gcc was giving me</span></div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span><span class="comment">   * &quot;expected primary-expression before &#39;&lt;&#39;&quot;.  I got the answer -- which reminds me of `typename` -- here:</span></div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span><span class="comment">   *   https://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords</span></div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span><span class="comment">   *   https://stackoverflow.com/questions/37995745/expected-primary-expression-before-token</span></div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span><span class="comment">   *</span></div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span><span class="comment">   * It also doesn&#39;t like it, if I remove `this-&gt;`. */</span></div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span>}</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span> </div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Value_set&gt;</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"><a class="line" href="classflow_1_1cfg_1_1Static__config__manager.html#a44bcca3798f4ce5c86b16d5cbba96f0d">  314</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#aacacd2c0eddaf68d0dc5e0c1407572f5">Static_config_manager&lt;Value_set&gt;::apply</a>(<a class="code hl_enumeration" href="classflow_1_1cfg_1_1Static__config__manager.html#a3d2415bc18039b0faeddb7181a8eb61f">allow_invalid_defaults_tag_t</a>,</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span>                                             <span class="keyword">const</span> fs::path&amp; cfg_path,</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span>                                             <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code hl_class" href="classflow_1_1Function.html">Final_validator_func&lt;Value_set&gt;::Type</a>&amp; final_validator_func)</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span>{</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span>  <span class="keywordflow">return</span> this-&gt;<span class="keyword">template</span> apply_static&lt;Value_set&gt;(Impl::S_ALLOW_INVALID_DEFAULTS, cfg_path, final_validator_func);</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span>}</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">  320</span> </div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Value_set&gt;</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"><a class="line" href="classflow_1_1cfg_1_1Static__config__manager.html#a1ad094865d998c52348375ffa07c8e70">  322</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#aacacd2c0eddaf68d0dc5e0c1407572f5">Static_config_manager&lt;Value_set&gt;::apply</a>(<span class="keyword">const</span> fs::path&amp; cfg_path)</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span>{</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span>  <span class="keywordflow">return</span> apply(cfg_path, <a class="code hl_struct" href="structflow_1_1cfg_1_1Final__validator__func.html">Final_validator_func&lt;Value_set&gt;::null</a>()); <span class="comment">// 2nd arg is a no-op/always-passes validator.</span></div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span>}</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span> </div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Value_set&gt;</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"><a class="line" href="classflow_1_1cfg_1_1Static__config__manager.html#a75b77fdd432ed8b254b36687b0cabc48">  328</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#aacacd2c0eddaf68d0dc5e0c1407572f5">Static_config_manager&lt;Value_set&gt;::apply</a>(<a class="code hl_enumeration" href="classflow_1_1cfg_1_1Static__config__manager.html#a3d2415bc18039b0faeddb7181a8eb61f">allow_invalid_defaults_tag_t</a>, <span class="keyword">const</span> fs::path&amp; cfg_path)</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span>{</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span>  <span class="keywordflow">return</span> apply(S_ALLOW_INVALID_DEFAULTS, cfg_path, <a class="code hl_struct" href="structflow_1_1cfg_1_1Final__validator__func.html">Final_validator_func&lt;Value_set&gt;::null</a>());</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span>}</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span> </div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Value_set&gt;</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"><a class="line" href="classflow_1_1cfg_1_1Static__config__manager.html#ae3576d329b71639e6acf38bb7a80e000">  334</a></span><span class="keyword">const</span> Value_set&amp; <a class="code hl_function" href="classflow_1_1cfg_1_1Static__config__manager.html#ae3576d329b71639e6acf38bb7a80e000">Static_config_manager&lt;Value_set&gt;::values</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span>  <span class="keywordflow">return</span> this-&gt;<span class="keyword">template</span> static_values&lt;Value_set&gt;(0); <span class="comment">// The managed value set is in slot 0.</span></div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span>}</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span> </div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Value_set&gt;</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"><a class="line" href="classflow_1_1cfg_1_1Static__config__manager.html#a9e86f85d749892c9e55ae74e07e48a35">  340</a></span>std::ostream&amp; <a class="code hl_function" href="namespaceflow_1_1cfg.html#af310e567f2763a9736eda686030e6311">operator&lt;&lt;</a>(std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1cfg_1_1Static__config__manager.html">Static_config_manager&lt;Value_set&gt;</a>&amp; val)</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span>{</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">  342</span>  <span class="keywordflow">return</span> os &lt;&lt; static_cast&lt;const typename Static_config_manager&lt;Value_set&gt;::Impl&amp;&gt;(val);</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span>}</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span> </div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span>} <span class="comment">// namespace flow::cfg</span></div>
<div class="ttc" id="acfg__manager_8hpp_html"><div class="ttname"><a href="cfg__manager_8hpp.html">cfg_manager.hpp</a></div></div>
<div class="ttc" id="acfg__manager__fwd_8hpp_html"><div class="ttname"><a href="cfg__manager__fwd_8hpp.html">cfg_manager_fwd.hpp</a></div></div>
<div class="ttc" id="aclassflow_1_1Function_html"><div class="ttname"><a href="classflow_1_1Function.html">flow::Function&lt; void(const Declare_options_func_args &amp;args)&gt;</a></div></div>
<div class="ttc" id="aclassflow_1_1cfg_1_1Config__manager_html"><div class="ttname"><a href="classflow_1_1cfg_1_1Config__manager.html">flow::cfg::Config_manager</a></div><div class="ttdoc">Manages a config setup, intended for a single daemon process, by maintaining 1 or more set(s) of stat...</div><div class="ttdef"><b>Definition:</b> <a href="cfg__manager_8hpp_source.html#l00383">cfg_manager.hpp:385</a></div></div>
<div class="ttc" id="aclassflow_1_1cfg_1_1Config__manager_html_a0192ddc2cc7302bdc8720ee56a395c02"><div class="ttname"><a href="classflow_1_1cfg_1_1Config__manager.html#a0192ddc2cc7302bdc8720ee56a395c02">flow::cfg::Config_manager&lt; Value_set, Null_value_set &gt;::log_help</a></div><div class="ttdeci">void log_help(log::Sev sev=log::Sev::S_INFO) const</div><div class="ttdoc">Logs what help_to_ostream() would print.</div><div class="ttdef"><b>Definition:</b> <a href="cfg__manager_8hpp_source.html#l00983">cfg_manager.hpp:2700</a></div></div>
<div class="ttc" id="aclassflow_1_1cfg_1_1Config__manager_html_a19ae9775f51953805ea08086c276a78d"><div class="ttname"><a href="classflow_1_1cfg_1_1Config__manager.html#a19ae9775f51953805ea08086c276a78d">flow::cfg::Config_manager&lt; Value_set, Null_value_set &gt;::state_to_ostream</a></div><div class="ttdeci">void state_to_ostream(std::ostream &amp;os) const</div><div class="ttdoc">Prints a human-targeted long-form summary of our contents, doubling as a usage message and a dump of ...</div><div class="ttdef"><b>Definition:</b> <a href="cfg__manager_8hpp_source.html#l00958">cfg_manager.hpp:2585</a></div></div>
<div class="ttc" id="aclassflow_1_1cfg_1_1Config__manager_html_a220535219634c62ed2a580934c76c481"><div class="ttname"><a href="classflow_1_1cfg_1_1Config__manager.html#a220535219634c62ed2a580934c76c481">flow::cfg::Config_manager&lt; Value_set, Null_value_set &gt;::log_state</a></div><div class="ttdeci">void log_state(log::Sev sev=log::Sev::S_INFO) const</div><div class="ttdoc">Logs what state_to_ostream() would print.</div><div class="ttdef"><b>Definition:</b> <a href="cfg__manager_8hpp_source.html#l00966">cfg_manager.hpp:2658</a></div></div>
<div class="ttc" id="aclassflow_1_1cfg_1_1Config__manager_html_ad5cda6ace05e8bbe52a5129ed1c0720c"><div class="ttname"><a href="classflow_1_1cfg_1_1Config__manager.html#ad5cda6ace05e8bbe52a5129ed1c0720c">flow::cfg::Config_manager&lt; Value_set, Null_value_set &gt;::help_to_ostream</a></div><div class="ttdeci">void help_to_ostream(std::ostream &amp;os) const</div><div class="ttdoc">Prints a human-targeted long-form usage message that includes all options with their descriptions and...</div><div class="ttdef"><b>Definition:</b> <a href="cfg__manager_8hpp_source.html#l00975">cfg_manager.hpp:2670</a></div></div>
<div class="ttc" id="aclassflow_1_1cfg_1_1Static__config__manager_html"><div class="ttname"><a href="classflow_1_1cfg_1_1Static__config__manager.html">flow::cfg::Static_config_manager</a></div><div class="ttdoc">A Config_manager-related adapter-style class that manages a simple config setup involving a single (t...</div><div class="ttdef"><b>Definition:</b> <a href="static__cfg__manager_8hpp_source.html#l00079">static_cfg_manager.hpp:81</a></div></div>
<div class="ttc" id="aclassflow_1_1cfg_1_1Static__config__manager_html_a3d2415bc18039b0faeddb7181a8eb61f"><div class="ttname"><a href="classflow_1_1cfg_1_1Static__config__manager.html#a3d2415bc18039b0faeddb7181a8eb61f">flow::cfg::Static_config_manager::allow_invalid_defaults_tag_t</a></div><div class="ttdeci">allow_invalid_defaults_tag_t</div><div class="ttdoc">Tag type: indicates an apply() method must allow invalid defaults and only complain if the config sou...</div><div class="ttdef"><b>Definition:</b> <a href="static__cfg__manager_8hpp_source.html#l00091">static_cfg_manager.hpp:92</a></div></div>
<div class="ttc" id="aclassflow_1_1cfg_1_1Static__config__manager_html_a3d2415bc18039b0faeddb7181a8eb61fab3dc15779c4820ed5ee06299bedf718a"><div class="ttname"><a href="classflow_1_1cfg_1_1Static__config__manager.html#a3d2415bc18039b0faeddb7181a8eb61fab3dc15779c4820ed5ee06299bedf718a">flow::cfg::Static_config_manager::S_ALLOW_INVALID_DEFAULTS</a></div><div class="ttdeci">@ S_ALLOW_INVALID_DEFAULTS</div><div class="ttdoc">Sole value for tag type allow_invalid_defaults_tag_t.</div><div class="ttdef"><b>Definition:</b> <a href="static__cfg__manager_8hpp_source.html#l00094">static_cfg_manager.hpp:93</a></div></div>
<div class="ttc" id="aclassflow_1_1cfg_1_1Static__config__manager_html_a77853af82c708377723671c92c6ab948"><div class="ttname"><a href="classflow_1_1cfg_1_1Static__config__manager.html#a77853af82c708377723671c92c6ab948">flow::cfg::Static_config_manager::Static_config_manager</a></div><div class="ttdeci">Static_config_manager(log::Logger *logger_ptr, util::String_view nickname, typename Option_set&lt; Value_set &gt;::Declare_options_func &amp;&amp;declare_opts_func_moved)</div><div class="ttdoc">Constructs a Static_config_manager ready to read static config via apply() and access it via values()...</div><div class="ttdef"><b>Definition:</b> <a href="static__cfg__manager_8hpp_source.html#l00292">static_cfg_manager.hpp:293</a></div></div>
<div class="ttc" id="aclassflow_1_1cfg_1_1Static__config__manager_html_a9e86f85d749892c9e55ae74e07e48a35"><div class="ttname"><a href="classflow_1_1cfg_1_1Static__config__manager.html#a9e86f85d749892c9e55ae74e07e48a35">flow::cfg::Static_config_manager::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Static_config_manager&lt; Value_set &gt; &amp;val)</div><div class="ttdoc">Serializes (briefly) a Static_config_manager to a standard output stream.</div><div class="ttdef"><b>Definition:</b> <a href="static__cfg__manager_8hpp_source.html#l00340">static_cfg_manager.hpp:340</a></div></div>
<div class="ttc" id="aclassflow_1_1cfg_1_1Static__config__manager_html_aacacd2c0eddaf68d0dc5e0c1407572f5"><div class="ttname"><a href="classflow_1_1cfg_1_1Static__config__manager.html#aacacd2c0eddaf68d0dc5e0c1407572f5">flow::cfg::Static_config_manager::apply</a></div><div class="ttdeci">bool apply(const fs::path &amp;cfg_path, const typename Final_validator_func&lt; Value_set &gt;::Type &amp;final_validator_func)</div><div class="ttdoc">Invoke this after construction to load the permanent set of static config from config sources includi...</div><div class="ttdef"><b>Definition:</b> <a href="static__cfg__manager_8hpp_source.html#l00301">static_cfg_manager.hpp:301</a></div></div>
<div class="ttc" id="aclassflow_1_1cfg_1_1Static__config__manager_html_ae3576d329b71639e6acf38bb7a80e000"><div class="ttname"><a href="classflow_1_1cfg_1_1Static__config__manager.html#ae3576d329b71639e6acf38bb7a80e000">flow::cfg::Static_config_manager::values</a></div><div class="ttdeci">const Value_set &amp; values() const</div><div class="ttdoc">Returns (always the same) reference to the managed Value_set structure.</div><div class="ttdef"><b>Definition:</b> <a href="static__cfg__manager_8hpp_source.html#l00334">static_cfg_manager.hpp:334</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Logger_html"><div class="ttname"><a href="classflow_1_1log_1_1Logger.html">flow::log::Logger</a></div><div class="ttdoc">Interface that the user should implement, passing the implementing Logger into logging classes (Flow'...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l01280">log.hpp:1284</a></div></div>
<div class="ttc" id="anamespaceflow_1_1cfg_html"><div class="ttname"><a href="namespaceflow_1_1cfg.html">flow::cfg</a></div><div class="ttdoc">Flow module that facilitates configuring modules, such as applications and APIs, via statically and/o...</div><div class="ttdef"><b>Definition:</b> <a href="cfg__fwd_8hpp_source.html#l00111">cfg_fwd.hpp:112</a></div></div>
<div class="ttc" id="anamespaceflow_1_1cfg_html_adfe41c8484a878742976ddb84aa9e2d8"><div class="ttname"><a href="namespaceflow_1_1cfg.html#adfe41c8484a878742976ddb84aa9e2d8">flow::cfg::null_declare_opts_func</a></div><div class="ttdeci">Option_set&lt; Null_value_set &gt;::Declare_options_func null_declare_opts_func()</div><div class="ttdoc">Returns a value usable as declare_opts_func_moved Config_manager ctor arg for a Null_value_set value ...</div><div class="ttdef"><b>Definition:</b> <a href="cfg__manager_8cpp_source.html#l00026">cfg_manager.cpp:26</a></div></div>
<div class="ttc" id="anamespaceflow_1_1cfg_html_af310e567f2763a9736eda686030e6311"><div class="ttname"><a href="namespaceflow_1_1cfg.html#af310e567f2763a9736eda686030e6311">flow::cfg::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Option_set&lt; Value_set &gt; &amp;val)</div><div class="ttdoc">Serializes (briefly) an Option_set to a standard output stream.</div><div class="ttdef"><b>Definition:</b> <a href="option__set_8hpp_source.html#l02154">option_set.hpp:2154</a></div></div>
<div class="ttc" id="anamespaceflow_1_1util_html_ae4dc52186797094b3040379ff19124c9"><div class="ttname"><a href="namespaceflow_1_1util.html#ae4dc52186797094b3040379ff19124c9">flow::util::String_view</a></div><div class="ttdeci">Basic_string_view&lt; char &gt; String_view</div><div class="ttdoc">Commonly used char-based Basic_string_view. See its doc header.</div><div class="ttdef"><b>Definition:</b> <a href="string__view_8hpp_source.html#l00191">string_view.hpp:191</a></div></div>
<div class="ttc" id="astructflow_1_1cfg_1_1Final__validator__func_html"><div class="ttname"><a href="structflow_1_1cfg_1_1Final__validator__func.html">flow::cfg::Final_validator_func</a></div><div class="ttdoc">Utility/traits type to concisely work with final-validation functions when calling methods like Confi...</div><div class="ttdef"><b>Definition:</b> <a href="cfg__manager_8hpp_source.html#l00040">cfg_manager.hpp:41</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Mar 28 2025 22:55:35 for Flow by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
